<?php
// +----------------------------------------------------------------------
// | WebSocket 命令
// +----------------------------------------------------------------------
// | 用于启动、停止和重启WebSocket服务
// +----------------------------------------------------------------------

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use fast\WebSocketServer;

class WebSocket extends Command
{
    /**
     * 配置命令
     */
    protected function configure()
    {
        $this->setName('websocket')
             ->setDescription('WebSocket服务管理命令')
             ->addArgument('action', Argument::REQUIRED, '操作: start|stop|restart')
             ->addOption('host', 'H', Option::VALUE_OPTIONAL, '服务器地址', '0.0.0.0')
             ->addOption('port', 'p', Option::VALUE_OPTIONAL, '服务器端口', 8282)
             ->addOption('daemon', 'd', Option::VALUE_NONE, '是否以守护进程方式运行');
    }
    
    /**
     * 执行命令
     * @param Input $input
     * @param Output $output
     * @return int
     */
    protected function execute(Input $input, Output $output)
    {
        $action = $input->getArgument('action');
        $host = $input->getOption('host');
        $port = $input->getOption('port');
        $daemon = $input->getOption('daemon');
        
        // 配置WebSocket服务器
        $config = [
            'host' => $host,
            'port' => $port,
            'daemon' => $daemon
        ];
        
        // 获取WebSocket服务器实例
        $server = WebSocketServer::getInstance($config);
        
        // 根据操作执行相应的命令
        switch ($action) {
            case 'start':
                $output->writeln('<info>正在启动WebSocket服务...</info>');
                $output->writeln(sprintf('<info>服务地址: ws://%s:%d</info>', $host, $port));
                $output->writeln('<info>按 Ctrl+C 停止服务</info>');
                $server->init()->start();
                break;
                
            case 'stop':
                $output->writeln('<info>正在停止WebSocket服务...</info>');
                $server->stop();
                $output->writeln('<info>WebSocket服务已停止</info>');
                break;
                
            case 'restart':
                $output->writeln('<info>正在重启WebSocket服务...</info>');
                $server->restart();
                $output->writeln('<info>WebSocket服务已重启</info>');
                break;
                
            default:
                $output->writeln('<error>无效的操作，请使用 start、stop 或 restart</error>');
                return 1;
        }
        
        return 0;
    }
}